Преобразует вариант из одного типа в другой с учетом LCID.
HRESULT VariantChangeTypeEx ( VARIANTARG VAR* pvargDetf, VARIANTARG FAR* pvarSrc, LCID kid, unsigned short wFlags, VARTYPE vt );
Параметры
pvargDest
Указатель на VARIANTARG, принимающий
результаты приведения типа. Если это тот же указатель, что и pvarSrc, то
вариант преобразуется по месту.
pvarSrc
Указатель на исходный
VARIANTARG, который нужно привести к новому
типу.
kid
LCID варианта, тип которого следует преобразовать.
LCID полезен в том случае, когда исходный или целевой тип — это
VT_BSTR, VT_DISPATCH или VT_DATE.
wFlags
Флаги,
управляющие преобразованием. В настоящий момент определен единственный флаг —
VARIANT_NOVALUEPROP, который запрещает функции пытаться преобразовывать объект к
базовому типу данных, обращаясь к свойству Value. Приложениям следует
устанавливать этот флаг только при необходимости, так как в результате их
поведение будет отличаться от поведения других приложений.
vt
Целевой тип преобразования. Если функция возвращает код
S_OK, то поле vt в *pvargDest всегда равно данному
значению.
Коды возврата
Из возвращенного HRESULT получают один из следующих
кодов возврата:
| Код возврата | Значение |
| S_OK | Успех. |
| DISP_E_BADVARTYPE | vt - недопустимый тип варианта. |
| DISP_E_OVERFLOW | Значение, на которое указывает pvarSrc, не умещается в диапазон целевого типа. |
| DISP_E_TYPEMISMATCH | Аргумент нельзя привести к заданному типу. |
| E_INVALIDARG | Один из аргументов неверен. |
| E_OUTOFMEMORY | He хватает памяти для преобразования. |
Комментарии
Функция VariantChangeTypeEx выполняет преобразование
между базовыми типами (включая преобразования из числа в строку и из строки в
число). Вариант, в котором установлен флаг VT_BYREF, преобразуется к тому
же типу, но без этого флага, путем получения значения, на которое он ссылается.
Объект приводится к значению базового типа путем обращения к свойству Value
(DISPID_VALUE).
Обычно реализация IDispatch::Invoke определяет, к
какому члену выполняется обращение, и затем вызывает VariantChangeTypeEx,
чтобы получить значение одного или нескольких аргументов. Например, если вызов
IDispatch задает член SetTitle, который принимает один строковый
аргумент, то реализация вызывает VariantChangeTypeEx, пытаясь
преобразовать параметр в VT_BSTR.
Если VariantChangeTypeEx не
возвращает ошибку, то значение аргумента можно считать непосредственно из поля
bstrVal структуры VARIANTARG. Если VariantChangeTypeEx
возвращает DISP_E_TYPEMISMATCH, то реализации следует установить
*puArgErr в 0 (указывая аргумент, вызвавший ошибку) и возвратить из
IDispatch::Invoke DISP_E_TYPEMISMATCH.
Данная функция не преобразует
массив одного типа в массив другого типа.
Примечание. Тип VARIANTARG
не следует преобразовывать по месту в массиве rgvarg.